home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / TURB_VIS / TCYBER25 / COMMON.ZIP / VGA.PAS < prev    next >
Pascal/Delphi Source File  |  1994-10-20  |  23KB  |  211 lines

  1. {
  2. Turbo Vision CyberTools 2.5
  3. (C) 1994 Steve Goldsmith
  4. All Rights Reserved
  5. }
  6.  
  7. {$I APP.INC} {$IFDEF UseDLL} LIBRARY VGA ;{$ELSE} UNIT VGA ;{$ENDIF} {$IFNDEF UseDLL} INTERFACE {$ENDIF} USES
  8. {$IFDEF UseDLL} CYBERAPI , {$ENDIF} MEMORY ;{$IFNDEF UseDLL} CONST VGAATTRINDEX =$03c0 ;VGAATTRDATA =$03c1 ;
  9. VGAATTRMODE =$10 ;VGAATTROVERSCAN =$11 ;VGAATTRCPENABLE =$12 ;VGAATTRHORZPELPAN =$13 ;VGAATTRCOLORSEL =$14 ;
  10. VGAMISCOUTWRITE =$03c2 ;VGASEQINDEX =$03c4 ;VGASEQRESET =$00 ;VGASEQCLOCKMODE =$01 ;VGASEQMAPMASK =$02 ;
  11. VGASEQCHRMAPSEL =$03 ;VGASEQMEMMODE =$04 ;VGADACPELMASK =$03c6 ;VGADACREAD =$03c7 ;VGADACWRITE =$03c8 ;
  12. VGADACPELDATA =$03c9 ;VGAMISCOUTREAD =$03cc ;VGAGRAPHINDEX =$03ce ;VGAGRAPHRESET =$00 ;VGAGRAPHENABLE =$01 ;
  13. VGAGRAPHCOLORCMP =$02 ;VGAGRAPHFUNCSEL =$03 ;VGAGRAPHREADMAP =$04 ;VGAGRAPHMODE =$05 ;VGAGRAPHMISC =$06 ;
  14. VGAGRAPHDONTCARE =$07 ;VGAGRAPHBITMASK =$08 ;VGACRTINDEX =$03d4 ;VGACRTHORZTOTAL =$00 ;VGACRTHORZDISPEND =$01 ;
  15. VGACRTSTARTHORZBLANK =$02 ;VGACRTENDHORZBLANK =$03 ;VGACRTSTARTHORZRESCAN =$04 ;VGACRTENDHORZRESCAN =$05 ;
  16. VGACRTVERTTOTAL =$06 ;VGACRTOVERFLOW =$07 ;VGACRTVERTPELPAN =$08 ;VGACRTMAXSCANLINE =$09 ;VGACRTCURSTART =$0a ;
  17. VGACRTCUREND =$0b ;VGACRTSTARTADDRHI =$0c ;VGACRTSTARTADDRLO =$0d ;VGACRTCURLOCHI =$0e ;VGACRTCURLOCLO =$0f ;
  18. VGACRTSTARTVERTRESCAN =$10 ;VGACRTENDVERTRESCAN =$11 ;VGACRTVERTDISPEND =$12 ;VGACRTOFFSET =$13 ;VGACRTUNDERLINELOC =$14
  19. ;VGACRTSTARTVERTBLANK =$15 ;VGACRTENDVERTBLANK =$16 ;VGACRTMODECONTROL =$17 ;VGACRTLINECOMPARE =$18 ;VGACRTSTATUS =$03da
  20. ;VGARGBMAX =2 ;VGADACREGMAX =255 ;VGAPALETTESIZE =768 ;VGAPAGEOFSLOC :ARRAY [ 0 .. 7 ]  OF WORD =($0000 , $0800 , $1000 ,
  21. $1800 , $2000 , $2800 , $3000 , $3800 );VGAPAGELOCOFS :ARRAY [ 0 .. 7 ]  OF WORD =($0000 , $1000 , $2000 , $3000 , $4000
  22. , $5000 , $6000 , $7000 );VGASCRWIDTH =80 ;VGASCRSIZE25 =2000 ;VGASCRSIZE50 =4000 ;VGAMAXCHRTABLES =8 ;
  23. VGAMAXCHRHEIGHT =32 ;VGAMAXCHRS =256 ;VGACHRTABLESIZE =8192 ;VGAROM8X14 =2 ;VGAROM8X8 =3 ;VGAROMALT8X8 =4 ;
  24. VGAROMALT9X14 =5 ;VGAROM8X16 =6 ;VGAROMALT9X16 =7 ;VGACHRTABLELOCOFS :ARRAY [ 0 .. 7 ]  OF WORD =($0000 , $4000 , $8000 ,
  25. $c000 , $2000 , $6000 , $a000 , $e000 );VGACHRTABLEMAP1 :ARRAY [ 0 .. 7 ]  OF BYTE =($00 , 01 , $02 , $03 , $10 , $11 ,
  26. $12 , $13 );VGACHRTABLEMAP2 :ARRAY [ 0 .. 7 ]  OF BYTE =($00 , $04 , $08 , $0c , $20 , $24 , $28 , $2c );
  27. VGABITTABLE :ARRAY [ 0 .. 7 ]  OF BYTE =(128 , 64 , 32 , 16 , 8 , 4 , 2 , 1 );VGANOCARD =0 ;VGAMDAMDA =1 ;VGACGACGA =2 ;
  28. VGAEGAEGA =4 ;VGAEGAMDA =5 ;VGAVGAMONO =7 ;VGAVGACOLOR =8 ;VGAMCGACGA =10 ;VGAMCGAMONO =11 ;VGAMCGACOLOR =12 ;
  29. VGADATABUFMAX =65519 ;VGASCR256LINE =320 ;TYPE VGADATABUFPTR =^VGADATABUF ;VGADATABUF =ARRAY [ 0 .. VGADATABUFMAX ]
  30.  OF BYTE ;VGAPALETTEPTR =^VGAPALETTE ;VGAPALETTE =ARRAY [ 0 .. VGADACREGMAX , 0 .. VGARGBMAX ]  OF BYTE ;
  31. VGACHRTABLEPTR =^VGACHRTABLE ;VGACHRTABLE =ARRAY [ 0 .. VGACHRTABLESIZE - 1 ]  OF BYTE ;VGALINE256 =ARRAY [ 0 .. 319 ]
  32.  OF BYTE ;VGASCREEN256 =ARRAY [ 0 .. 199 ]  OF VGALINE256 ;PROCEDURE SETSEQCONT (INDEXREG ,DATAREG:BYTE );
  33. FUNCTION GETSEQCONT (INDEXREG :BYTE ):BYTE ;PROCEDURE SETCRTCONT (INDEXREG ,DATAREG:BYTE );FUNCTION GETCRTCONT
  34. (INDEXREG :BYTE ):BYTE ;PROCEDURE SETGRAPHCONT (INDEXREG ,DATAREG:BYTE );FUNCTION GETGRAPHCONT (INDEXREG :BYTE ):BYTE ;
  35. PROCEDURE SETATTRCONT (INDEXREG ,DATAREG:BYTE );FUNCTION GETATTRCONT (INDEXREG :BYTE ):BYTE ;PROCEDURE SETMISCOUTPUT
  36. (DATAREG :BYTE );FUNCTION GETMISCOUTPUT :BYTE ;PROCEDURE WAITVERTSYNC ;PROCEDURE WAITDISPENABLE ;PROCEDURE SETCHRWIDTH8 ;
  37. PROCEDURE SETCHRWIDTH9 ;FUNCTION ISCHRWIDTH9 :BOOLEAN ;PROCEDURE SETPAGE (STARTOFS :WORD );PROCEDURE COPYSCRMEM
  38. (SRC ,DEST:POINTER ;LEN :WORD );PROCEDURE SETDAC (REGNUM ,R,G,B:BYTE );PROCEDURE GETDAC (REGNUM :BYTE ;
  39. VAR R ,G,B:BYTE );PROCEDURE SETDACBLOCK (PALPTR :POINTER ;STARTREG ,REGCNT:WORD );PROCEDURE GETDACBLOCK
  40. (PALPTR :POINTER ;STARTREG ,REGCNT:WORD );PROCEDURE FADEOUTDAC (FADEINC :BYTE );PROCEDURE FADEINDAC
  41. (DEFPAL :VGAPALETTEPTR ;FADEINC :BYTE );PROCEDURE ACCESSFONTMEM ;PROCEDURE ACCESSSCREENMEM ;PROCEDURE FONTMAPSELECT
  42. (FONT1 ,FONT2:BYTE );PROCEDURE FONTMAPVAL (MAPSEL :BYTE ;VAR FONT1 ,FONT2:BYTE );PROCEDURE FONTTABLELOC (MAPSEL :BYTE ;
  43. VAR FONT1PTR ,FONT2PTR:POINTER );PROCEDURE SETRAMTABLE (STARTCHR ,TOTALCHRS,HEIGHT:WORD ;
  44. BUFADDR ,CHRADDR:VGACHRTABLEPTR );FUNCTION GETRAMTABLE (STARTCHR ,TOTALCHRS,HEIGHT:WORD ;
  45. CHRADDR :VGACHRTABLEPTR ):VGACHRTABLEPTR ;PROCEDURE SETTABLEPIX (X ,Y,XLEN,HEIGHT:WORD ;CHRADDR :VGACHRTABLEPTR ;
  46. PIXON :BOOLEAN );PROCEDURE DRAWTABLELINE (X1 ,Y1,X2,Y2,XLEN,HEIGHT:INTEGER ;CHRADDR :VGACHRTABLEPTR ;PIXON :BOOLEAN );
  47. PROCEDURE DRAWTABLEELLIPSE (XC ,YC,A,B,XLEN,HEIGHT:INTEGER ;CHRADDR :VGACHRTABLEPTR ;PIXON :BOOLEAN );
  48. FUNCTION VGACARDACTIVE :BOOLEAN ;PROCEDURE BIOSSETVIDEO (MODE :BYTE );PROCEDURE BIOSSETPALREG (REGNUM ,REGDATA:BYTE );
  49. FUNCTION BIOSGETPALREG (REGNUM :BYTE ):BYTE ;PROCEDURE BIOSSETDAC (REGNUM ,R,G,B:BYTE );PROCEDURE BIOSGETDAC
  50. (REGNUM :BYTE ;VAR R ,G,B:BYTE );PROCEDURE BIOSSETDACBLOCK (PALPTR :POINTER ;STARTREG ,REGCNT:WORD );
  51. PROCEDURE BIOSGETDACBLOCK (PALPTR :POINTER ;STARTREG ,REGCNT:WORD );PROCEDURE BIOSFONTMAPSELECT (FONT1 ,FONT2:BYTE );
  52. FUNCTION BIOSGETCHRHEIGHT :BYTE ;FUNCTION BIOSGETROMTABLEPTR (INFO :BYTE ):POINTER ;FUNCTION BIOSCOPYROMTABLE
  53. (INFO :BYTE ):VGACHRTABLEPTR ;PROCEDURE BIOSSETCHRTABLE (CHRTABLE :BYTE );PROCEDURE BIOSLOADFONT (CHRDATA :POINTER ;
  54. CHRTABLE ,CHRHEIGHT:BYTE ;STARTCHR ,NUMCHRS:WORD );PROCEDURE BIOSSETFONT (CHRDATA :POINTER ;CHRTABLE ,CHRHEIGHT:BYTE ;
  55. STARTCHR ,NUMCHRS:WORD );PROCEDURE BIOSLOAD8X8FONT (CHRTABLE :BYTE );PROCEDURE BIOSLOAD8X14FONT (CHRTABLE :BYTE );
  56. PROCEDURE BIOSLOAD8X16FONT (CHRTABLE :BYTE );PROCEDURE BIOSSET8X8FONT (CHRTABLE :BYTE );PROCEDURE BIOSSET8X14FONT
  57. (CHRTABLE :BYTE );PROCEDURE BIOSSET8X16FONT (CHRTABLE :BYTE );PROCEDURE MOUSETEXTMASK (ANDMASK ,XORMASK:WORD );{$ENDIF}
  58. VAR VGAPAGELOC :ARRAY [ 0 .. 7 ]  OF POINTER ;VGACHRTABLELOC :ARRAY [ 0 .. 7 ]  OF POINTER ;{$IFNDEF UseDLL}
  59. IMPLEMENTATION {$ENDIF}PROCEDURE SETSEQCONT (INDEXREG,DATAREG:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {}
  60. MOV DX , VGASEQINDEX{} MOV AL , INDEXREG{} MOV AH , DATAREG{} OUT DX , AX {} END;FUNCTION GETSEQCONT (INDEXREG:BYTE):BYTE
  61. ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV DX , VGASEQINDEX{} MOV AL , INDEXREG{} OUT DX , AL {} INC DX {}
  62. IN AL , DX {} END;PROCEDURE SETCRTCONT (INDEXREG,DATAREG:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {}
  63. MOV DX , VGACRTINDEX{} MOV AL , INDEXREG{} MOV AH , DATAREG{} OUT DX , AX {} END;FUNCTION GETCRTCONT (INDEXREG:BYTE):BYTE
  64. ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV DX , VGACRTINDEX{} MOV AL , INDEXREG{} OUT DX , AL {} INC DX {}
  65. IN AL , DX {} END;PROCEDURE SETGRAPHCONT (INDEXREG,DATAREG:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {}
  66. MOV DX , VGAGRAPHINDEX{} MOV AL , INDEXREG{} MOV AH , DATAREG{} OUT DX , AX {} END;FUNCTION GETGRAPHCONT
  67. (INDEXREG:BYTE):BYTE ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV DX , VGAGRAPHINDEX{} MOV AL , INDEXREG{}
  68. OUT DX , AL {} INC DX {} IN AL , DX {} END;PROCEDURE SETATTRCONT (INDEXREG,DATAREG:BYTE);{$IFDEF UseDLL}EXPORT ;
  69. {$ENDIF}ASSEMBLER;ASM {} CALL WAITVERTSYNC{} MOV DX , VGAATTRINDEX{} MOV AL , INDEXREG{} OUT DX , AL {}
  70. MOV AL , DATAREG{} OUT DX , AL {} MOV DX , VGACRTSTATUS{} IN AL , DX {} MOV DX , VGAATTRINDEX{} MOV AL , 20h {}
  71. OUT DX , AL {} CALL WAITDISPENABLE{} END;FUNCTION GETATTRCONT (INDEXREG:BYTE):BYTE ;{$IFDEF UseDLL}EXPORT ;
  72. {$ENDIF}ASSEMBLER;ASM {} CALL WAITVERTSYNC{} MOV DX , VGAATTRINDEX{} MOV AL , INDEXREG{} OUT DX , AL {}
  73. MOV DX , VGAATTRDATA{} IN AL , DX {} XCHG AL , AH {} MOV DX , VGACRTSTATUS{} IN AL , DX {} MOV DX , VGAATTRINDEX{}
  74. MOV AL , 20h {} OUT DX , AL {} CALL WAITDISPENABLE{} XCHG AL , AH {} END;PROCEDURE SETMISCOUTPUT (DATAREG:BYTE);
  75. {$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV DX , VGAMISCOUTWRITE{} MOV AL , DATAREG{} OUT DX , AL {} END;
  76. FUNCTION GETMISCOUTPUT :BYTE ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV DX , VGAMISCOUTREAD{} IN AL , DX {}
  77. END;PROCEDURE WAITVERTSYNC ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV DX , VGACRTSTATUS{} @rep1 : {}
  78. IN AL , DX {} TEST AL , 08h {} JZ @rep1 {} END;PROCEDURE WAITDISPENABLE ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {}
  79. MOV DX , VGACRTSTATUS{} @rep1 : {} IN AL , DX {} TEST AL , 08h {} JNZ @rep1 {} END;PROCEDURE SETCHRWIDTH8 ;
  80. {$IFDEF UseDLL}EXPORT ;{$ENDIF}BEGIN SETMISCOUTPUT (GETMISCOUTPUT AND $f3 );SETSEQCONT (VGASEQRESET , $01 );SETSEQCONT
  81. (VGASEQCLOCKMODE , $01 );SETSEQCONT (VGASEQRESET , $03 );SETATTRCONT (VGAATTRHORZPELPAN , $00 )END ;
  82. PROCEDURE SETCHRWIDTH9 ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}BEGIN SETMISCOUTPUT (GETMISCOUTPUT OR $04 );SETSEQCONT
  83. (VGASEQRESET , $01 );SETSEQCONT (VGASEQCLOCKMODE , $00 );SETSEQCONT (VGASEQRESET , $03 );SETATTRCONT (VGAATTRHORZPELPAN ,
  84. $08 )END ;FUNCTION ISCHRWIDTH9 :BOOLEAN ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}BEGIN ISCHRWIDTH9 := (GETMISCOUTPUT AND $0c )=$04
  85. END ;PROCEDURE SETPAGE (STARTOFS:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV BL , VGACRTSTARTADDRLO{}
  86. MOV BH , BYTE PTR STARTOFS{} MOV CL , VGACRTSTARTADDRHI{} MOV CH , BYTE PTR STARTOFS+ 1 {} CALL WAITDISPENABLE{}
  87. MOV DX , VGACRTINDEX{} MOV AX , BX {} OUT DX , AX {} MOV AX , CX {} OUT DX , AX {} END;PROCEDURE COPYSCRMEM
  88. (SRC,DEST:POINTER;LEN:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} PUSH DS {} LDS SI , SRC{} LES DI , DEST{}
  89. MOV CX , LEN{} CLD {} REP MOVSW {} POP DS {} END;PROCEDURE SETDAC (REGNUM,R,G,B:BYTE);{$IFDEF UseDLL}EXPORT ;
  90. {$ENDIF}ASSEMBLER;ASM {} CALL WAITVERTSYNC{} MOV DX , VGADACWRITE{} MOV AL , REGNUM{} OUT DX , AL {} INC DX {}
  91. MOV AL , R{} OUT DX , AL {} MOV AL , G{} OUT DX , AL {} MOV AL , B{} OUT DX , AL {} CALL WAITDISPENABLE{} END;
  92. PROCEDURE GETDAC (REGNUM:BYTE;VAR R,G,B:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} CALL WAITVERTSYNC{}
  93. MOV DX , VGADACREAD{} MOV AL , REGNUM{} OUT DX , AL {} MOV DX , VGADACPELDATA{} IN AL , DX {} LES DI , R{}
  94. MOV ES : [ DI ] , AL {} IN AL , DX {} LES DI , G{} MOV ES : [ DI ] , AL {} IN AL , DX {} LES DI , B{}
  95. MOV ES : [ DI ] , AL {} CALL WAITDISPENABLE{} END;PROCEDURE SETDACBLOCK (PALPTR:POINTER;STARTREG,REGCNT:WORD);
  96. {$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} LES SI , PALPTR{} MOV BL , 3 {} MOV AX , STARTREG{}
  97. MOV DX , VGADACWRITE{} OUT DX , AL {} @rep1 : {} MOV CX , REGCNT{} CALL WAITVERTSYNC{} MOV DX , VGADACPELDATA{}
  98. @rep2 : {} MOV AL , ES : [ SI ] {} OUT DX , AL {} INC SI {} LOOP @rep2 {} CALL WAITDISPENABLE{} DEC BL {} JNZ @rep1 {}
  99. END;PROCEDURE GETDACBLOCK (PALPTR:POINTER;STARTREG,REGCNT:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {}
  100. LES SI , PALPTR{} MOV BL , 3 {} MOV AX , STARTREG{} MOV DX , VGADACREAD{} OUT DX , AL {} @rep1 : {} MOV CX , REGCNT{}
  101. CALL WAITVERTSYNC{} MOV DX , VGADACPELDATA{} @rep2 : {} IN AL , DX {} MOV ES : [ SI ] , AL {} INC SI {} LOOP @rep2 {}
  102. CALL WAITDISPENABLE{} DEC BL {} JNZ @rep1 {} END;PROCEDURE FADEOUTDAC (FADEINC:BYTE);{$IFDEF UseDLL}EXPORT ;
  103. {$ENDIF}VAR O10100I1l0l1I:BOOLEAN;OI10Illl01l,OI11I0I0ll0:BYTE;OI11l0101I0:VGAPALETTE;BEGIN GETDACBLOCK (@ OI11l0101I0 ,
  104. 0 , 256 );REPEAT O10100I1l0l1I := TRUE ;FOR OI11I0I0ll0 := 0 TO VGADACREGMAX  DO FOR OI10Illl01l := 0 TO VGARGBMAX  DO IF
  105. OI11l0101I0 [ OI11I0I0ll0 , OI10Illl01l ] >= FADEINC THEN BEGIN DEC (OI11l0101I0 [ OI11I0I0ll0 , OI10Illl01l ] , FADEINC
  106. );O10100I1l0l1I := FALSE END ELSE OI11l0101I0 [ OI11I0I0ll0 , OI10Illl01l ] := 0 ;SETDACBLOCK (@ OI11l0101I0 , 0 , 256
  107. )UNTIL O10100I1l0l1I END ;PROCEDURE FADEINDAC (DEFPAL:VGAPALETTEPTR;FADEINC:BYTE);{$IFDEF UseDLL}EXPORT ;
  108. {$ENDIF}VAR O10100I1l0l1I:BOOLEAN;OI10Illl01l,OI11I0I0ll0:BYTE;OI11l0101I0:VGAPALETTE;BEGIN GETDACBLOCK (@ OI11l0101I0 ,
  109. 0 , 256 );REPEAT O10100I1l0l1I := TRUE ;FOR OI11I0I0ll0 := 0 TO VGADACREGMAX  DO FOR OI10Illl01l := 0 TO VGARGBMAX  DO IF
  110. OI11l0101I0 [ OI11I0I0ll0 , OI10Illl01l ] <= DEFPAL ^[ OI11I0I0ll0 , OI10Illl01l ] - FADEINC THEN BEGIN INC (OI11l0101I0
  111. [ OI11I0I0ll0 , OI10Illl01l ] , FADEINC );O10100I1l0l1I := FALSE END ELSE OI11l0101I0 [ OI11I0I0ll0 , OI10Illl01l ] :=
  112. DEFPAL ^[ OI11I0I0ll0 , OI10Illl01l ] ;SETDACBLOCK (@ OI11l0101I0 , 0 , 256 )UNTIL O10100I1l0l1I END ;
  113. PROCEDURE ACCESSFONTMEM ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}BEGIN ASM {} PUSHF {} CLI {} END;SETSEQCONT (VGASEQMEMMODE , $07
  114. );SETGRAPHCONT (VGAGRAPHREADMAP , $02 );SETGRAPHCONT (VGAGRAPHMODE , $00 );SETGRAPHCONT (VGAGRAPHMISC , $04 );SETSEQCONT
  115. (VGASEQMAPMASK , $04 );ASM {} POPF {} END END ;PROCEDURE ACCESSSCREENMEM ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}BEGIN ASM {}
  116. PUSHF {} CLI {} END;SETSEQCONT (VGASEQMAPMASK , $03 );SETSEQCONT (VGASEQMEMMODE , $03 );SETGRAPHCONT (VGAGRAPHREADMAP ,
  117. $00 );SETGRAPHCONT (VGAGRAPHMODE , $10 );SETGRAPHCONT (VGAGRAPHMISC , $0e );ASM {} POPF {} END END ;
  118. PROCEDURE FONTMAPSELECT (FONT1,FONT2:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}BEGIN SETSEQCONT (VGASEQCHRMAPSEL , FONT1 OR
  119. FONT2 )END ;PROCEDURE FONTMAPVAL (MAPSEL:BYTE;VAR FONT1,FONT2:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}BEGIN FONT1 :=
  120. ((MAPSEL AND $10 )SHR 2 )OR (MAPSEL AND $03 );FONT2 := ((MAPSEL AND $20 )SHR 3 )OR ((MAPSEL AND $0c )SHR 2 )END ;
  121. PROCEDURE FONTTABLELOC (MAPSEL:BYTE;VAR FONT1PTR,FONT2PTR:POINTER);{$IFDEF UseDLL}EXPORT ;
  122. {$ENDIF}VAR OI1I1lIII0l1,Ol001O10llII:BYTE;BEGIN FONTMAPVAL (MAPSEL , OI1I1lIII0l1 , Ol001O10llII );FONT1PTR :=
  123. VGACHRTABLELOC [ OI1I1lIII0l1 ] ;FONT2PTR := VGACHRTABLELOC [ Ol001O10llII ] END ;PROCEDURE SETRAMTABLE
  124. (STARTCHR,TOTALCHRS,HEIGHT:WORD;BUFADDR,CHRADDR:VGACHRTABLEPTR);{$IFDEF UseDLL}EXPORT ;
  125. {$ENDIF}VAR O1lI0111OIIl,OI110Il1III1:WORD;BEGIN FOR O1lI0111OIIl := 0 TO TOTALCHRS - 1  DO FOR OI110Il1III1 := 0 TO
  126. HEIGHT - 1  DO CHRADDR ^[ (O1lI0111OIIl + STARTCHR )* VGAMAXCHRHEIGHT + OI110Il1III1 ] := BUFADDR ^[ O1lI0111OIIl *
  127. HEIGHT + OI110Il1III1 ] END ;FUNCTION GETRAMTABLE (STARTCHR,TOTALCHRS,HEIGHT:WORD;CHRADDR:VGACHRTABLEPTR):VGACHRTABLEPTR
  128. ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}VAR O1lI0111OIIl,OI110Il1III1:WORD;OOlIIO1O1OO0:VGACHRTABLEPTR;BEGIN OOlIIO1O1OO0 :=
  129. MEMALLOC (HEIGHT * TOTALCHRS );IF OOlIIO1O1OO0 <> NIL THEN BEGIN FOR O1lI0111OIIl := 0 TO TOTALCHRS - 1
  130.  DO FOR OI110Il1III1 := 0 TO HEIGHT - 1  DO OOlIIO1O1OO0 ^[ O1lI0111OIIl * HEIGHT + OI110Il1III1 ] := CHRADDR ^[
  131. (O1lI0111OIIl + STARTCHR )* VGAMAXCHRHEIGHT + OI110Il1III1 ] END ;GETRAMTABLE := OOlIIO1O1OO0 END ;PROCEDURE SETTABLEPIX
  132. (X,Y,XLEN,HEIGHT:WORD;CHRADDR:VGACHRTABLEPTR;PIXON:BOOLEAN);{$IFDEF UseDLL}EXPORT ;
  133. {$ENDIF}VAR O1lI0111OIIl,OI110Il1III1:WORD;BEGIN O1lI0111OIIl := (X SHR 3 )+ (Y DIV HEIGHT * XLEN );OI110Il1III1 := Y MOD
  134. HEIGHT ;IF PIXON THEN CHRADDR ^[ O1lI0111OIIl * VGAMAXCHRHEIGHT + OI110Il1III1 ] := CHRADDR ^[ O1lI0111OIIl *
  135. VGAMAXCHRHEIGHT + OI110Il1III1 ] OR VGABITTABLE [ (X AND 7 )] ELSE CHRADDR ^[ O1lI0111OIIl * VGAMAXCHRHEIGHT +
  136. OI110Il1III1 ] := CHRADDR ^[ O1lI0111OIIl * VGAMAXCHRHEIGHT + OI110Il1III1 ] AND NOT VGABITTABLE [ (X AND 7 )] END ;
  137. PROCEDURE DRAWTABLELINE (X1,Y1,X2,Y2,XLEN,HEIGHT:INTEGER;CHRADDR:VGACHRTABLEPTR;PIXON:BOOLEAN);{$IFDEF UseDLL}EXPORT ;
  138. {$ENDIF}VAR O1I10Ol1,O1I1Il0I,OOIO,OOIl,O10OI1l0O0I0l,O10OI1l0O0I10,OIOI,OO1I:INTEGER;BEGIN O10OI1l0O0I0l := 1 ;O1I10Ol1
  139. := X2 - X1 ;IF O1I10Ol1 < 0 THEN BEGIN O10OI1l0O0I0l := - 1 ;O1I10Ol1 := - O1I10Ol1 END ;O1I1Il0I := Y2 - Y1 ;IF O1I1Il0I
  140. < 0 THEN BEGIN O10OI1l0O0I10 := - 1 ;O1I1Il0I := - O1I1Il0I END ELSE IF O1I1Il0I > 0 THEN O10OI1l0O0I10 := 1 ELSE
  141. O10OI1l0O0I10 := 0 ;OOIO := X1 ;OOIl := Y1 ;SETTABLEPIX (OOIO , OOIl , XLEN , HEIGHT , CHRADDR , PIXON );IF O1I10Ol1 >
  142. O1I1Il0I THEN BEGIN OO1I := O1I10Ol1 SHR 1 ;FOR OIOI := 1 TO O1I10Ol1  DO BEGIN OOIO := OOIO + O10OI1l0O0I0l ;OO1I :=
  143. OO1I + O1I1Il0I ;IF OO1I >= O1I10Ol1 THEN BEGIN OOIl := OOIl + O10OI1l0O0I10 ;OO1I := OO1I - O1I10Ol1 END ;SETTABLEPIX
  144. (OOIO , OOIl , XLEN , HEIGHT , CHRADDR , PIXON )END END ELSE BEGIN OO1I := O1I1Il0I SHR 1 ;FOR OIOI := 1 TO O1I1Il0I
  145.  DO BEGIN OOIl := OOIl + O10OI1l0O0I10 ;OO1I := OO1I + O1I10Ol1 ;IF OO1I >= O1I1Il0I THEN BEGIN OOIO := OOIO +
  146. O10OI1l0O0I0l ;OO1I := OO1I - O1I1Il0I END ;SETTABLEPIX (OOIO , OOIl , XLEN , HEIGHT , CHRADDR , PIXON )END END END ;
  147. PROCEDURE DRAWTABLEELLIPSE (XC,YC,A,B,XLEN,HEIGHT:INTEGER;CHRADDR:VGACHRTABLEPTR;PIXON:BOOLEAN);{$IFDEF UseDLL}EXPORT ;
  148. {$ENDIF}VAR OOIO,OOIl:INTEGER;O101OO10,O1OI0OlO010,OOlI0O1OII10,O10I0OII,O1OI0l000II,OOlI1IIOOOl1,OI11l00O1I0:LONGINT;
  149. BEGIN O101OO10 := LONGINT (A )* A ;O10I0OII := LONGINT (B )* B ;O1OI0OlO010 := O101OO10 SHL 1 ;O1OI0l000II := O10I0OII
  150. SHL 1 ;OOIO := 0 ;OOIl := B ;OOlI1IIOOOl1 := 0 ;OOlI0O1OII10 := OOIl * O1OI0OlO010 ;OI11l00O1I0 := - OOIl * O101OO10 ;
  151. WHILE OOlI1IIOOOl1 <= OOlI0O1OII10  DO BEGIN SETTABLEPIX (XC + OOIO , YC + OOIl , XLEN , HEIGHT , CHRADDR , PIXON );
  152. SETTABLEPIX (XC + OOIO , YC - OOIl , XLEN , HEIGHT , CHRADDR , PIXON );SETTABLEPIX (XC - OOIO , YC + OOIl , XLEN , HEIGHT
  153. , CHRADDR , PIXON );SETTABLEPIX (XC - OOIO , YC - OOIl , XLEN , HEIGHT , CHRADDR , PIXON );INC (OOIO );OOlI1IIOOOl1 :=
  154. OOlI1IIOOOl1 + O1OI0l000II ;OI11l00O1I0 := OI11l00O1I0 + OOlI1IIOOOl1 - O10I0OII ;IF OI11l00O1I0 >= 0 THEN BEGIN DEC
  155. (OOIl );OOlI0O1OII10 := OOlI0O1OII10 - O1OI0OlO010 ;OI11l00O1I0 := OI11l00O1I0 - OOlI0O1OII10 END END ;OOIO := A ;OOIl :=
  156. 0 ;OOlI1IIOOOl1 := OOIO * O1OI0l000II ;OOlI0O1OII10 := 0 ;OI11l00O1I0 := - OOIO * O10I0OII ;WHILE OOlI1IIOOOl1 >
  157. OOlI0O1OII10  DO BEGIN SETTABLEPIX (XC + OOIO , YC + OOIl , XLEN , HEIGHT , CHRADDR , PIXON );SETTABLEPIX (XC + OOIO , YC
  158. - OOIl , XLEN , HEIGHT , CHRADDR , PIXON );SETTABLEPIX (XC - OOIO , YC + OOIl , XLEN , HEIGHT , CHRADDR , PIXON );
  159. SETTABLEPIX (XC - OOIO , YC - OOIl , XLEN , HEIGHT , CHRADDR , PIXON );INC (OOIl );OOlI0O1OII10 := OOlI0O1OII10 +
  160. O1OI0OlO010 ;OI11l00O1I0 := OI11l00O1I0 + OOlI0O1OII10 - O101OO10 ;IF OI11l00O1I0 >= 0 THEN BEGIN DEC (OOIO );
  161. OOlI1IIOOOl1 := OOlI1IIOOOl1 - O1OI0l000II ;OI11l00O1I0 := OI11l00O1I0 - OOlI1IIOOOl1 END END END ;
  162. FUNCTION VGACARDACTIVE :BOOLEAN ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1a00h {} INT 10h {}
  163. XCHG AL , AH {} SUB AL , AL {} CMP AH , 1ah {} JNZ @endif1 {} CMP BL , VGAVGACOLOR{} JNZ @endif1 {} INC AL {}
  164. @endif1 : {} END;PROCEDURE BIOSSETVIDEO (MODE:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} SUB AH , AH {}
  165. MOV AL , MODE{} INT 10h {} END;PROCEDURE BIOSSETPALREG (REGNUM,REGDATA:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;
  166. ASM {} MOV AX , 1000h {} MOV BH , REGDATA{} MOV BL , REGNUM{} INT 10h {} END;FUNCTION BIOSGETPALREG (REGNUM:BYTE):BYTE ;
  167. {$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV BL , REGNUM{} MOV AX , 1007h {} INT 10h {} MOV AL , BH {} END;
  168. PROCEDURE BIOSSETDAC (REGNUM,R,G,B:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} XOR BH , BH {} MOV BL , REGNUM{}
  169. MOV AX , 1010h {} MOV DH , R{} MOV CH , G{} MOV CL , B{} INT 10h {} END;PROCEDURE BIOSGETDAC (REGNUM:BYTE;
  170. VAR R,G,B:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} XOR BH , BH {} MOV BL , REGNUM{} MOV AX , 1015h {}
  171. INT 10h {} LES DI , R{} MOV ES : [ DI ] , DH {} LES DI , G{} MOV ES : [ DI ] , CH {} LES DI , B{} MOV ES : [ DI ] , CL {}
  172.  END;PROCEDURE BIOSSETDACBLOCK (PALPTR:POINTER;STARTREG,REGCNT:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {}
  173. MOV AX , 1012h {} MOV BX , STARTREG{} MOV CX , REGCNT{} LES DX , PALPTR{} INT 10h {} END;PROCEDURE BIOSGETDACBLOCK
  174. (PALPTR:POINTER;STARTREG,REGCNT:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1017h {}
  175. MOV BX , STARTREG{} MOV CX , REGCNT{} LES DX , PALPTR{} INT 10h {} END;PROCEDURE BIOSFONTMAPSELECT (FONT1,FONT2:BYTE);
  176. {$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1103h {} MOV BL , FONT1{} OR BL , FONT2{} INT 10h {} END;
  177. FUNCTION BIOSGETCHRHEIGHT :BYTE ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1130h {} MOV BH , 6 {}
  178. PUSH BP {} INT 10h {} POP BP {} MOV AX , CX {} END;FUNCTION BIOSGETROMTABLEPTR (INFO:BYTE):POINTER ;
  179. {$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1130h {} MOV BH , INFO{} PUSH BP {} INT 10h {} MOV AX , BP {}
  180. POP BP {} MOV DX , ES {} END;FUNCTION BIOSCOPYROMTABLE (INFO:BYTE):VGACHRTABLEPTR ;{$IFDEF UseDLL}EXPORT ;
  181. {$ENDIF}VAR OIl0OII10lI:WORD;OI11I1l0lII,OIlI1OlO00I:VGACHRTABLEPTR;BEGIN OI11I1l0lII := BIOSGETROMTABLEPTR (INFO );
  182. OIlI1OlO00I := NIL ;CASE INFO  OF VGAROM8X8 :OIl0OII10lI := 8 ;VGAROMALT8X8 :OIl0OII10lI := 8 ;VGAROM8X14 :OIl0OII10lI :=
  183. 14 ;VGAROMALT9X14 :OIl0OII10lI := 14 ;VGAROM8X16 :OIl0OII10lI := 16 ;VGAROMALT9X16 :OIl0OII10lI := 16 END ;OIlI1OlO00I :=
  184. MEMALLOC (OIl0OII10lI * VGAMAXCHRS );IF OIlI1OlO00I <> NIL THEN MOVE (OI11I1l0lII ^, OIlI1OlO00I ^, OIl0OII10lI *
  185. VGAMAXCHRS );BIOSCOPYROMTABLE := OIlI1OlO00I END ;PROCEDURE BIOSSETCHRTABLE (CHRTABLE:BYTE);{$IFDEF UseDLL}EXPORT ;
  186. {$ENDIF}ASSEMBLER;ASM {} MOV AX , 1103h {} MOV BL , CHRTABLE{} INT 10h {} END;PROCEDURE BIOSLOADFONT (CHRDATA:POINTER;
  187. CHRTABLE,CHRHEIGHT:BYTE;STARTCHR,NUMCHRS:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1100h {}
  188. MOV BH , CHRHEIGHT{} MOV BL , CHRTABLE{} MOV CX , NUMCHRS{} MOV DX , STARTCHR{} LES SI , CHRDATA{} PUSH BP {}
  189. MOV BP , SI {} INT 10h {} POP BP {} END;PROCEDURE BIOSSETFONT (CHRDATA:POINTER;CHRTABLE,CHRHEIGHT:BYTE;
  190. STARTCHR,NUMCHRS:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1110h {} MOV BH , CHRHEIGHT{}
  191. MOV BL , CHRTABLE{} MOV CX , NUMCHRS{} MOV DX , STARTCHR{} LES SI , CHRDATA{} PUSH BP {} MOV BP , SI {} INT 10h {}
  192. POP BP {} END;PROCEDURE BIOSLOAD8X8FONT (CHRTABLE:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1102h {}
  193. MOV BL , CHRTABLE{} INT 10h {} END;PROCEDURE BIOSLOAD8X14FONT (CHRTABLE:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;
  194. ASM {} MOV AX , 1101h {} MOV BL , CHRTABLE{} INT 10h {} END;PROCEDURE BIOSLOAD8X16FONT (CHRTABLE:BYTE);
  195. {$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1104h {} MOV BL , CHRTABLE{} INT 10h {} END;
  196. PROCEDURE BIOSSET8X8FONT (CHRTABLE:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1112h {}
  197. MOV BL , CHRTABLE{} INT 10h {} END;PROCEDURE BIOSSET8X14FONT (CHRTABLE:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;
  198. ASM {} MOV AX , 1111h {} MOV BL , CHRTABLE{} INT 10h {} END;PROCEDURE BIOSSET8X16FONT (CHRTABLE:BYTE);
  199. {$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1114h {} MOV BL , CHRTABLE{} INT 10h {} END;
  200. PROCEDURE MOUSETEXTMASK (ANDMASK,XORMASK:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 0ah {}
  201. SUB BX , BX {} MOV CX , ANDMASK{} MOV DX , XORMASK{} INT 33h {} END;PROCEDURE O1l0OI1llOO0 ;VAR OIlO:BYTE;BEGIN FOR OIlO
  202. := 0 TO 7  DO BEGIN VGAPAGELOC [ OIlO ] := PTR (SEGB800 , VGAPAGELOCOFS [ OIlO ] );VGACHRTABLELOC [ OIlO ] := PTR
  203. (SEGA000 , VGACHRTABLELOCOFS [ OIlO ] )END END ;{$IFDEF UseDLL}EXPORTS SETSEQCONT , GETSEQCONT , SETCRTCONT , GETCRTCONT
  204. , SETGRAPHCONT , GETGRAPHCONT , SETATTRCONT , GETATTRCONT , SETMISCOUTPUT , GETMISCOUTPUT , WAITVERTSYNC , WAITDISPENABLE
  205. , SETCHRWIDTH8 , SETCHRWIDTH9 , ISCHRWIDTH9 , SETPAGE , COPYSCRMEM , SETDAC , GETDAC , SETDACBLOCK , GETDACBLOCK ,
  206. FADEOUTDAC , FADEINDAC , ACCESSFONTMEM , ACCESSSCREENMEM , FONTMAPSELECT , FONTMAPVAL , FONTTABLELOC , SETRAMTABLE ,
  207. GETRAMTABLE , SETTABLEPIX , DRAWTABLELINE , DRAWTABLEELLIPSE , VGACARDACTIVE , BIOSSETVIDEO , BIOSSETPALREG ,
  208. BIOSGETPALREG , BIOSSETDAC , BIOSGETDAC , BIOSSETDACBLOCK , BIOSGETDACBLOCK , BIOSFONTMAPSELECT , BIOSGETCHRHEIGHT ,
  209. BIOSGETROMTABLEPTR , BIOSCOPYROMTABLE , BIOSSETCHRTABLE , BIOSLOADFONT , BIOSSETFONT , BIOSLOAD8X8FONT , BIOSLOAD8X14FONT
  210. , BIOSLOAD8X16FONT , BIOSSET8X8FONT , BIOSSET8X14FONT , BIOSSET8X16FONT , MOUSETEXTMASK ;{$ENDIF}BEGIN O1l0OI1llOO0 END.
  211.